\documentclass[a4paper,10pt]{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage[pdftex]{graphicx}

\begin{document}
\title{\textbf{Sistemas Operativos}\\ Trabajo Práctico 3\\ }
\author{45129 - Gou Xinwei \\ 45390 - Oybin Pablo Nahuel \\ 46069 - Sessa Carlos}
\date{}
\maketitle

\begin{abstract}
\begin{center}
    Filtro por MAC en el firewall de Minix 2.0.4.
\end{center}
\end{abstract}

\section{Objetivos}
Modificar un firewall realizado por alumnos de la cursada pasada, agregándole
filtro por MAC.

\section{Introducción}
En este escrito se explicarán las decisiones tomadas durante el desarrollo del
trabajo. Se usó como base el firewall realizado por los alumnos del
cuatrimestre pasado.

En la primera sección \textbf{Implementación} se menciona qué cosas fueron
cambiadas para lograr lo pedido. En la sección \textbf{Ejemplos} se mencionan
testeos realizados durante el desarrollo que sirven como ejemplo para mostrar
cómo funciona y por último se ofrece una sección de
\textbf{Problemas encontrados} seguida de \textbf{Posibles extensiones}.

\section{Implementación}

\subsection{fwrule}

Para contar con filtro de MAC agregamos a la estructura fwrule la mac
destino, la mac origen, y un flag mac\_flag que es simplemente un
enum \{NO\_MATCH, MATCH\}.

\begin{verbatim}
typedef struct fwrule {
    unsigned int id;
    ipaddr_t src_ip;
    ipaddr_t dst_ip;
    action_t action;
    proto_t protocol;
    port_t src_port;
    port_t dst_port;
    mask_t netmaskin;
    mask_t netmaskout;
    match_mac_t mac_flag;
    struct ether_addr dst_mac;
    struct ether_addr src_mac;
} fwrule_t;
\end{verbatim}

\subsection{Filtro en Nivel de Enlace}
Para realizar el filtro a nivel enlace se agregó una función a firewall.c
llamada can\_pass\_mac. Esta función es llamada por eth\_send y eth\_arrive.
Notar que can\_pass\_mac no determina si un paquete puede pasar o no. Como
queda otra capa, sólo prende un flag en la regla diciendo si matcheó o no
y la capa de arriba determinará si debe filtrarse o no.

\subsection{Filtro en Nivel de Red}
El filtro a nivel red se mantuvo casi igual al original. La única diferencia
es que ahora la regla contiene el flag modificado por el filtro de la capa
de abajo. Con esa información y la de su capa, en este nivel se determina
si el paquete debe ser filtrado o no.

\subsection{Parseo de parámetros}
Se agregó al parser original un -m para MAC destino y un -M para MAC origen.

\section{Ejemplos}
Para realizar los ejemplos se usa que A es una pc en la red
y B es la pc corriendo minix.

\subsection{INPUT}
\subsubsection{fireWall -A INPUT -M xx:xx:xx:xx:xx:xx -J DENY}
Si A ejecuta ping B.ip() no debe recibir respuesta.

\subsubsection{fireWall -A INPUT -M xx:xx:xx:xx:xx:xx -p tcp -O 22 -J DENY}
Si a ejecuta nc B.ip() 22 no debe recibir respuesta,
pero sí debe recibir respuesta de pings.

\subsubsection{fireWall -A INPUT -M xx:xx:xx:xx:xx:xx -p tcp -I 2002 -J DENY}
Si a ejecuta nc -p 2002 B.ip() 22 no debe responderle,
pero sí debe recibir respuesta de pings.

\subsection{OUTPUT}
\subsubsection{fireWall -A OUTPUT -m xx:xx:xx:xx:xx:xx -J DENY}
Si A ejecuta ping B.ip() no debe recibir respuesta.

\subsubsection{fireWall -A OUTPUT -m xx:xx:xx:xx:xx:xx -p tcp -O 21 -J DENY}
Si B ejecuta ftp A.ip() no debe poder conectarse,
pero A puede pinguear a B.


\section{Problemas encontrados}
\subsection{Dónde hacer el filtrado de MAC}

\subsubsection{En can\_pass de firewall.c}
En un principio intentamos agregar condiciones al can\_pass realizado por
el grupo anterior, pero de donde se llaman esas funciones no se encuentra
la mac origen y/o destino. Por lo tanto, era imposible agregarlo ahí.

\subsubsection{En eth\_send y eth\_arrive en eth.c}
Esta idea fue nuestra primera versión funcional.
El problema que tenía es que no permitía combinación con la capa de red.
Si matcheaba una regla en el nivel de enlace, se decidía ahí si droppearlo
o no.

\subsubsection{Migrar todo a eth\_send y eth\_arrive en eth.c}
Después de hacer la versión mencionada anteriormente discutimos si era
mejor mover todo el análisis a la capa de enlace que contiene el paquete
completo con toda la información.
Afortunadamente antes de hacerlo optamos por investigar cómo funciona
iptables y dónde realiza los filtrados. El hacer eso nos llevó
a la versión final y mucho más funcional que la anterior.

\subsection{Dificultad para programar}
Al principio utilizábamos vi desde dentro de minix y nos
resultó un poco incómodo, entonces, aprovechando que minix 2.0.4 tiene
capa de red, programábamos y después lo subíamos por ftp.


\section{Posibles extensiones}

\subsection{Thread-safe}
El código en el que nos basamos, cada paquete que llega pone el puntero de
la lista al principio. Si hay dos threads usando la lista al mismo tiempo,
puede haber problemas.

\subsection{Filtro en otros niveles}
De la misma manera que se implementó filtros en nivel enlace. Podrían
agregarse otros filtros pertinentes en otros niveles.


\begin{thebibliography}{}

\bibitem[Keith Haviland, 1999]
- Keith Haviland, Dina Gray, Ben Salama, \emph{UNIX System Programming Second Edition},
Addison-Wesley, 1999.

\bibitem[Tanenbaum, Andrew S, 1997]
- Tanenbaum, Andrew S, Woodhull, Albert, \emph{Operating Systems:Design and
Implementation 2nd Edition}, Prentice Hall.


\end{thebibliography}
\end{document}
